﻿/**
* ds.dialog.js (弹窗JavaScript)
* DAVID 2015-04-08
*/

//DAVID 2015-04-08 


//信息提示框 提示Info
function davidInfo(tips) {
    ds.dialog({
        title:"系统提示",
        content:tips,
        timeout:2,
		//icon : "info.png",
        onyes:true,
    });
}
//信息提示框 报错Error
function davidError(tips) {
    ds.dialog({
        title:"系统提示",
        content:tips,
        timeout:2,
		//icon : "error.png",
        onyes:true,
    });
	return false;
}
//信息提示框 确定OK
function davidOk(tips) {
    ds.dialog({
        title:"系统提示",
        content:tips,
        timeout:2,
		//icon : "success.png",
        onyes:true,
    });
}
function davidConfrim(tips) {
    ds.dialog({
        title:"系统提示",
        content:tips,
        timeout:2
    });
}
//DAVID End 

(function(global, document, $, undefined) {
    var view = $(global), DOC = $(document), ds = global.ds || (global.ds = {});
    var _guid = 0, _noop = function() {}, _tmpl = '<div class="ds_dialog_outer"><table class="ds_dialog_border"><tr><td class="ds_dialog_tl" style="display:none"></td><td class="ds_dialog_tc" style="display:none"></td><td class="ds_dialog_tr" style="display:none"></td></tr><tr><td class="ds_dialog_ml" style="display:none"></td><td class="ds_dialog_mc"><div class="ds_dialog_inner"><table class="ds_dialog_panel"><tr><td colspan="2" class="ds_dialog_header"><div class="ds_dialog_title"><h3></h3></div><div class="ds_dialog_close"><a href="javascript:;">×</a></div></td></tr><tr><td class="ds_dialog_icon" style="display:none"><div class="ds_dialog_icon_bg"></div></td><td class="ds_dialog_main"><div id="{id}_content" class="ds_dialog_content"></div></td></tr><tr><td colspan="2" class="ds_dialog_footer"><div class="ds_dialog_buttons"></div></td></tr></table></div></td><td class="ds_dialog_mr" style="display:none"></td></tr><tr><td class="ds_dialog_bl" style="display:none"></td><td class="ds_dialog_bc" style="display:none"></td><td class="ds_dialog_br" style="display:none"></td></tr></table></div>', _ops = {
        id:null,
        title:null,
        content:"",
        className:null,
        padding:"20px 25px",
        height:"auto",
        width:"auto",
        left:"50%",
        top:"40%",
        zIndex:1990,
        icon:null,
        iconBasePath:global.iconBasePath || "/template/images/confrim/",
        buttons:null,
        follow:null,
        followOffset:null,
        autoOpen:true,
        esc:true,
        lock:true,
        lockOpacity:.6,
        lockColor:"#000",
        showCloseButton:true,
        drag:true,
        fixed:true,
        anim:true,
        animDuration:320,
        timeout:0,
        oninit:_noop,
        onopen:_noop,
        onfocus:_noop,
        onmaskclick:_noop,
        onhide:_noop,
        onclose:_noop,
        yesText:"确定",
        noText:"取消",
        onyes:null,
        onno:null
    }, Dialog = ds.Dialog = function(ops) {
        return this.init(ops || {});
    };
    //console.log("DAVID出品、实属佳品");
    $.extend(Dialog, {
        items:{},
        defaults:_ops,
        currIndex:1990,
        defaultTmpl:_tmpl,
        activeDialog:null,
        dialogQueue:[],
        addDialog:function(dialog) {
            var queue = this.dialogQueue;
            this.removeDialog(dialog);
            queue.push(dialog);
            dialog.inQueue = true;
            dialog.queueIndex = queue.length - 1;
        },
        removeDialog:function(dialog) {
            var i = dialog.queueIndex, queue = this.dialogQueue;
            if (dialog.inQueue) {
                queue.splice(i, 1);
                for (var len = queue.length; i < len; i++) {
                    queue[i].queueIndex--;
                }
            }
            dialog.inQueue = false;
            dialog.queueIndex = -1;
        },
        maskQueue:[],
        addMask:function(dialog) {
            this.removeMask(dialog);
            this.maskQueue.push(dialog);
            dialog.maskIndex = this.maskQueue.length - 1;
        },
        removeMask:function(dialog) {
            var i = dialog.maskIndex, maskQueue = this.maskQueue;
            if (dialog.locked) {
                maskQueue.splice(i, 1);
                for (var len = maskQueue.length; i < len; i++) {
                    maskQueue[i].maskIndex--;
                }
            }
            dialog.maskIndex = -1;
        }
    });
    Dialog.items = {};
    Dialog.defaults = _ops;
    Dialog.currZIndex = 1990;
    Dialog.defaultTmpl = _tmpl;
    Dialog.prototype = {
        version:"2.0",
        constructor:Dialog,
        init:function(ops) {
            var id = typeof ops.id === "string" ? ops.id :"ds_dialog_" + ++_guid;
            if (Dialog.items[id]) {
                var dialog = Dialog.items[id], rOps = dialog.ops;
                var opsChangeMaps = {
                    left:1,
                    top:1,
                    follow:1,
                    onopen:1,
                    onfocus:1,
                    onhide:1,
                    onclose:1,
                    onyes:1,
                    onno:1,
                    esc:2,
                    lock:2,
                    anim:2,
                    drag:2,
                    fixed:2,
                    autoOpen:2,
                    icon:3,
                    content:3
                };
                $.each(ops, function(k, val) {
                    if (k in opsChangeMaps && val !== void 0) {
                        var type = opsChangeMaps[k];
                        if (type === 2) {
                            val = !!val;
                        }
                        if (val !== rOps[k]) {
                            rOps[k] = val;
                            type === 3 && dialog[k](val);
                        }
                    }
                });
                dialog[rOps.drag ? "initDrag" :"releaseDrag"]();
                dialog[rOps.fixed ? "initFixed" :"releaseFixed"]();
                rOps.autoOpen && dialog.show();
                return dialog;
            }
            $.each(_ops, function(k, val) {
                typeof ops[k] === "undefined" && (ops[k] = val);
            });
            if (!$.isArray(ops.followOffset)) {
                ops.followOffset = [ 0, 0 ];
            }
            this.id = id;
            this.ops = ops;
            this._getElem(ops);
            Dialog.items[id] = this;
            this._initEvent();
            this.padding(ops.padding).size(ops.width, ops.height).title(ops.title).button(ops.buttons).icon(ops.icon).content(ops.content).timeout(ops.timeout);
            typeof ops.oninit === "function" && ops.oninit.call(this);
            ops.fixed && this.initFixed && this.initFixed();
            ops.drag && this.initDrag && this.initDrag();
            ops.autoOpen && this.show();
        },
        _getElem:function(ops) {
            var shell = document.createElement("div");
            shell.id = this.id;
            shell.tabIndex = -1;
            shell.style.position = "absolute";
            shell.className = "ds_dialog" + (ops.className ? " " + ops.className :"");
            shell.innerHTML = Dialog.defaultTmpl.replace(/\{id\}/g, this.id);
            shell = this.shell = $(shell);
            this.contentShell = shell.find(".ds_dialog_content").eq(0);
            this.buttonShell = shell.find(".ds_dialog_buttons").eq(0);
            this.titleShell = shell.find(".ds_dialog_title").eq(0);
            this.closeShell = shell.find(".ds_dialog_close").eq(0);
            this.iconShell = shell.find(".ds_dialog_icon").eq(0);
            this.closeShell[ops.showCloseButton ? "show" :"hide"]();
            var buttons = ops.buttons;
            if (!$.isArray(buttons)) {
                buttons = ops.buttons = [];
            }
            if (ops.onyes === true || typeof ops.onyes === "function") {
                buttons.push({
                    autoFocus:true,
                    text:ops.yesText,
                    className:"ds_dialog_yes",
                    onclick:function() {
                        return $.type(ops.onyes) === "function" && ops.onyes.call(this) === false || !ops.onyes ? false :this.hide();
                    }
                });
            }
            if (ops.onno === true || typeof ops.onno === "function") {
                buttons.push({
                    text:ops.noText,
                    className:"ds_dialog_no",
                    onclick:function() {
                        return $.type(ops.onno) === "function" && ops.onno.call(this) === false || !ops.onno ? false :this.hide();
                    }
                });
            }
            return shell;
        },
        _initEvent:function() {
            var self = this;
            this.closeShell.bind("click", function(e) {
                e.stopPropagation();
                e.preventDefault();
                self.hide();
            });
            this.shell.bind("mousedown", function() {
                self.focus();
            });
        },
        isOpen:false,
        show:function(left, top) {
            var ops = this.ops, shell = this.shell;
            if (!this._inDOM) {
                this._inDOM = true;
                shell.appendTo("body");
            }
            if (!this.isOpen) {
                ops.lock && this.lock();
                !ops.follow || arguments.length >= 1 ? this.position(left || ops.left, top || ops.top) :this.follow(ops.follow, ops.followOffset[0], ops.followOffset[1]);
                ops.anim ? shell.stop().animate({
                    opacity:1
                }, ops.animDuration) :shell.stop().css("opacity", 1);
                shell.css("display", "block");
                this.isOpen = true;
                ops.onopen.call(this);
            }
            return this.focus();
        },
        hide:function() {
            var ops = this.ops;
            if (this.isOpen) {
                this.isOpen = false;
                if (ops.onhide.call(this) !== false) {
                    this.blur().unlock();
                    ops.anim ? this.shell.stop().animate({
                        opacity:0
                    }, ops.animDuration, function() {
                        this.style.display = "none";
                    }) :this.shell.stop().hide();
                    Dialog.removeDialog(this);
                } else {
                    this.isOpen = true;
                }
            }
            return this;
        },
        focus:function() {
            var ops = this.ops;
            if (this.isOpen && !this.hasFocus && ops.onfocus.call(this) !== false) {
                Dialog.activeDialog && Dialog.activeDialog._blur();
                Dialog.addDialog(this);
                var shell = this.shell;
                this.zIndex = Dialog.currZIndex = Math.max(++Dialog.currZIndex, this.ops.zIndex);
                shell.addClass("ds_dialog_active").css("zIndex", this.zIndex);
                if ("focus" in shell[0]) {
                    shell[0].focus();
                    this.focusButton && this.focusButton.focus();
                }
                Dialog.activeDialog = this;
                this.hasFocus = true;
            }
            return this;
        },
        _blur:function() {
            this.hasFocus = false;
            this.shell.removeClass("ds_dialog_active");
        },
        blur:function() {
            if (this.hasFocus) {
                this._blur();
                var queue = Dialog.dialogQueue, len = queue.length;
                if (len > 1) {
                    queue[len - 2].focus();
                } else {
                    Dialog.activeDialog = null;
                }
            }
            return this;
        },
        close:function() {
            var self = this, ops = this.ops;
            if (this.shell && ops.onclose.call(this) !== false) {
                if (ops.anim) {
                    this.hide();
                    setTimeout(function() {
                        self.destory();
                    }, ops.animDuration);
                } else {
                    this.hide().destory();
                }
            }
        },
        timeout:function(delay) {
            var self = this;
            clearTimeout(this.timer);
            if (~~delay > 0) {
                this.timer = setTimeout(function() {
                    self.close();
                }, ~~delay * 1e3);
            }
            return this;
        },
        destory:function() {
            delete Dialog.items[this.id];
            if (this.shell) {
                this.shell.hide().remove();
            }
            this.shell = this.contentShell = this.buttonShell = this.titleShell = this.closeShell = this.iconShell = this.focusButton = null;
        },
        _getPositionLimit:function() {
            var ops = this.ops, shell = this.shell, offset = shell.offset(), viewScrollLeft = view.scrollLeft(), viewScrollTop = view.scrollTop(), shellWidth = shell.outerWidth(), shellHeight = shell.outerHeight(), viewWidth = view.width(), viewHeight = view.height(), minTop = ops.fixed ? 0 :viewScrollTop, minLeft = ops.fixed ? 0 :viewScrollLeft, maxTop = minTop + viewHeight - shellHeight, maxLeft = minLeft + viewWidth - shellWidth;
            return {
                minTop:minTop,
                minLeft:minLeft,
                maxTop:maxTop,
                maxLeft:maxLeft,
                viewHeight:viewHeight,
                viewWidth:viewWidth,
                height:shellHeight,
                width:shellWidth,
                top:offset.top,
                left:offset.left,
                viewScrollTop:viewScrollTop,
                viewScrollLeft:viewScrollLeft
            };
        },
        _position:function(left, top) {
            var ops = this.ops, style = this.shell[0].style;
            style.left = left + "px";
            style.top = top + "px";
        },
        position:function(left, top) {
            if (arguments.length < 1) {
                return this.shell.offset();
            }
            var ops = this.ops, rper = /(\d+\.?\d+)%/, limit = this._getPositionLimit();
            if (rper.test(left)) {
                left = (limit.viewWidth - limit.width) * parseFloat(RegExp.$1) / 100;
                left += ops.fixed ? 0 :limit.viewScrollLeft;
            }
            if (rper.test(top)) {
                top = (limit.viewHeight - limit.height) * parseFloat(RegExp.$1) / 100;
                top += ops.fixed ? 0 :limit.viewScrollTop;
            }
            left = Math.max(limit.minLeft, Math.min(limit.maxLeft, left));
            top = Math.max(limit.minTop, Math.min(limit.maxTop, top));
            this._position(left, top);
            return this;
        },
        size:function(width, height) {
            this.contentShell.css("width", width).css("height", height);
            return this;
        },
        padding:function(padding) {
            this.contentShell.css("padding", padding);
            return this;
        },
        follow:function() {
            var _offsetMaps = {
                left:function() {
                    return 0;
                },
                right:function(shell, target) {
                    return target.outerWidth() - shell.outerWidth();
                },
                top:function(shell, target) {
                    return -shell.outerHeight();
                },
                bottom:function(shell, target) {
                    return target.outerHeight();
                }
            }, _getOffset = function(shell, target, _offset) {
                if (_offsetMaps[_offset[0]]) {
                    _offset[0] = _offsetMaps[_offset[0]](shell, target);
                }
                if (_offsetMaps[_offset[1]]) {
                    _offset[1] = _offsetMaps[_offset[1]](shell, target);
                }
                return [ ~~_offset[0], ~~_offset[1] ];
            };
            return function(target, left, top) {
                target = $(target);
                var pos = $(target).offset(), offset = _getOffset(this.shell, target, [ left, top ]);
                if (this.ops.fixed) {
                    pos.left -= view.scrollLeft();
                    pos.top -= view.scrollTop();
                }
                return this.position(pos.left + offset[0], pos.top + offset[1]);
            };
        }(),
        title:function(title) {
            if (!title) {
                this.titleShell.hide();
            } else {
                this.titleShell.html("<h3>" + title + "</h3>");
                this.titleShell.show();
            }
            return this;
        },
        content:function(content) {
            this.contentShell.html(content);
            return this.position(this.ops.left, this.ops.top);
        },
        button:function(buttons) {
            var self = this, ops = this.ops, shell = this.buttonShell.hide();
            if ($.isArray(buttons) && buttons.length > 0) {
                $.each(buttons, function(i) {
                    var btn = document.createElement("button");
                    btn.disabled = this.disabled;
                    btn.innerHTML = "<span>" + this.text + "</span>";
                    btn.className = this.className + (this.disabled ? " disabled" :"");
                    btn = $(btn);
                    var onclick = this.onclick;
                    btn.bind("click", function(e) {
                        e.stopPropagation();
                        typeof onclick === "function" && onclick.call(self, this, e);
                    });
                    if (this.autoFocus) {
                        self.focusButton = btn;
                    }
                    shell.append(btn);
                });
                shell.show();
            }
            return this;
        },
        icon:function(iconUrl) {
            var shell = this.iconShell;
            if (!!iconUrl) {
                shell.find("div")[0].style.backgroundImage = "url(" + this.ops.iconBasePath + iconUrl + ")";
                shell.show();
            } else {
                shell.hide();
            }
            return this;
        },
        lock:function(opacity, lockColor) {
            var ops = this.ops, mask = Dialog.mask;
            if (!mask) {
                mask = Dialog.mask = new ds.Mask({
                    opacity:_ops.lockOpacity,
                    background:_ops.lockColor,
                    onclick:function() {
                        var dialog = Dialog.activeDialog;
                        dialog && dialog.ops.onmaskclick.call(dialog);
                    }
                });
            }
            Dialog.addMask(this);
            lockColor = lockColor || ops.lockColor;
            if (mask._lastBackground !== lockColor) {
                mask._lastBackground = lockColor;
                mask._getElem().css("background", lockColor);
            }
            mask.show(opacity || ops.opacity);
            this.locked = true;
            return this;
        },
        unlock:function() {
            if (this.locked) {
                Dialog.removeMask(this);
                var maskQueue = Dialog.maskQueue;
                if (maskQueue.length > 0) {
                    maskQueue[maskQueue.length - 1].lock();
                } else {
                    Dialog.mask.hide();
                }
                this.locked = false;
            }
            return this;
        }
    };
    (function() {
        var rinput = /INPUT|TEXTAREA/i;
        DOC.bind("keydown", function(e) {
            var dialog = Dialog.activeDialog;
            if (dialog && dialog.ops.esc && e.keyCode === 27 && !rinput.test(e.target.nodeName)) {
                dialog.hide();
            }
        });
    })();
    $.extend(Dialog.prototype, function() {
        var supportFixed;
        return {
            initFixed:function() {
                if (typeof supportFixed !== "boolean") {
                    supportFixed = ds.Mask.fixedPositionSupport();
                }
                if (!this._initFixed) {
                    var shell = this.shell;
                    shell[0].style.position = supportFixed ? "fixed" :"absolute";
                    this.ops.fixed = true;
                    if (!supportFixed) {
                        this.ops.fixed = false;
                    }
                    this._initFixed = true;
                }
                return this;
            },
            releaseFixed:function() {
                if (this._initFixed) {
                    var pos = this.position(), scrollLeft = view.scrollLeft(), scrollTop = view.scrollTop();
                    this.position(pos.left + scrollLeft, pos.top + scrollTop);
                    this.shell[0].style.position = "absolute";
                    this.ops.fixed = false;
                }
                return this;
            }
        };
    }());
    $.extend(Dialog.prototype, function() {
        var html = document.documentElement, hasCapture = "setCapture" in html, hasCaptureEvt = "onlosecapture" in html, clearRanges = "getSelection" in global ? function() {
            global.getSelection().removeAllRanges();
        } :function() {
            document.selection && document.selection.empty();
        }, isNotDragArea = function(dialog, target) {
            var content = dialog.contentShell[0], close = dialog.closeShell[0];
            if (target == content || $.contains(content, target) || target === close || $.contains(close, target) || $.contains(dialog.buttonShell[0], target)) {
                return true;
            }
            return false;
        };
        return {
            initDrag:function() {
                if (!this._dragHandler) {
                    var self = this;
                    this._dragHandler = function(e) {
                        if (e.button !== 0 && e.button !== 1 || isNotDragArea(self, e.target)) {
                            return;
                        }
                        var ops = self.ops, shell = self.shell, limit = self._getPositionLimit(), currDrag = Dialog._currDrag = {
                            limit:limit,
                            dialog:self,
                            offsetTop:e.pageY - limit.top,
                            offsetLeft:e.pageX - limit.left,
                            onmousemove:function(e) {
                                var top = e.pageY - currDrag.offsetTop, left = e.pageX - currDrag.offsetLeft;
                                top -= ops.fixed ? limit.viewScrollTop :0;
                                left -= ops.fixed ? limit.viewScrollLeft :0;
                                top = Math.min(limit.maxTop, top);
                                left = Math.min(limit.maxLeft, left);
                                ops.top = Math.max(limit.minTop, top);
                                ops.left = Math.max(limit.minLeft, left);
                                self._position(ops.left, ops.top);
                                clearRanges();
                            },
                            onmouseup:function() {
                                hasCapture && shell[0].releaseCapture();
                                hasCaptureEvt ? shell.unbind("losecapture", currDrag.onmouseup) :view.unbind("blur", currDrag.onmouseup);
                                DOC.unbind("mousemove", currDrag.onmousemove).unbind("mouseup", currDrag.onmouseup);
                                shell.removeClass("ds_dialog_drag");
                                Dialog._currDrag = null;
                            }
                        };
                        hasCaptureEvt ? shell.bind("losecapture", currDrag.onmouseup) :view.bind("blur", currDrag.onmouseup);
                        hasCapture && shell[0].setCapture();
                        DOC.bind("mousemove", currDrag.onmousemove).bind("mouseup", currDrag.onmouseup);
                        shell.addClass("ds_dialog_drag");
                        return false;
                    };
                    this.shell.bind("mousedown", this._dragHandler);
                }
                return this;
            },
            releaseDrag:function() {
                if (this._dragHandler) {
                    this.shell.unbind("mousedown", this._dragHandler);
                    this._dragHandler = null;
                }
                return this;
            }
        };
    }());
    ds.dialog = function(ops, onyes, onno) {
        if (typeof ops === "string") {
            ops = {
                content:ops,
                title:arguments[1] || "消息提示",
                onyes:onyes,
                onno:onno
            };
        }
        return new Dialog(ops || {});
    };
    $.extend(ds.dialog, {
        items:Dialog.items,
        alert:function(content, onhide, icon) {
            if (typeof onhide === "string") {
                icon = onhide;
            }
            return new Dialog({
                id:"ds_dialog_alert",
                fixed:true,
                left:"50%",
                top:"40%",
                icon:icon ? icon :"info.png",
                title:"消息提示",
                content:content,
                buttons:[ {
                    text:"确定",
                    autoFocus:true,
                    className:"ds_dialog_yes",
                    onclick:function() {
                        this.close();
                    }
                } ],
                onhide:typeof onhide === "function" ? onhide :function() {}
            });
        },
        confirm:function(content, onyes, onno, onhide) {
            return new Dialog({
                id:"ds_dialog_confirm",
                fixed:true,
                left:"50%",
                top:"40%",
                //icon:"confirm.png",
                title:"消息确认",
                content:content,
                onyes:onyes || true,
                onhide:onhide,
                onno:onno || true
            });
        },
        prompt:function(content, onyes, defaultValue) {
            return new Dialog({
                id:"ds_dialog_prompt",
                fixed:true,
                left:"50%",
                top:"40%",
                //icon:"confirm.png",
                title:"消息确认",
                content:'<p style="margin:0;padding:0 0 5px;">' + content + '</p><div><input type="text" style="color:#333;font-size:12px;padding:.42em .33em;width:18em;" /></div>',
                onopen:function() {
                    var self = this, input = this._input;
                    if (!input) {
                        input = this._input = this.contentShell.find("input");
                        input.bind("keydown", function(e) {
                            if (e.keyCode === 13 && self.focusButton) {
                                self.focusButton.trigger("click");
                                return false;
                            }
                        });
                    }
                    input.val(defaultValue || "");
                },
                onfocus:function() {
                    var input = this._input[0];
                    setTimeout(function() {
                        input.select();
                        input.focus();
                    }, 32);
                },
                onclose:function() {
                    this._input = null;
                },
                onyes:function() {
                    var input = this._input[0];
                    return typeof onyes === "function" ? onyes.call(this, input.value, input) :void 0;
                },
                onno:true
            });
        },
        tips:function(content, timeout, follow, lock) {
            if (typeof follow === "boolean") {
                lock = follow;
                follow = null;
            }
            return new Dialog({
                id:"ds_dialog_tips",
                fixed:true,
                esc:false,
                lock:!!lock,
                follow:follow,
                followOffset:[ 0, "bottom" ],
                drag:false,
                content:content,
                padding:"12px 50px",
                showCloseButton:false,
                timeout:timeout || 0
            });
        }
    });
})(this, this.document, jQuery);

(function(global, document, $, undefined) {
    var DOC = $(document), _noop = function() {}, ds = global.ds || (global.ds = {});
    var _uuid = 0, _ops = {
        id:null,
        anim:true,
        animDuration:320,
        zIndex:999,
        opacity:.8,
        background:"#000",
        onshow:_noop,
        onhide:_noop,
        onclick:_noop
    }, Mask = ds.Mask = function(ops) {
        return this.init(ops);
    };
    Mask._cache = {};
    Mask.prototype = {
        constructor:Mask,
        init:function(ops) {
            this.ops = ops = ops || {};
            $.each(_ops, function(k, val) {
                typeof ops[k] === "undefined" && (ops[k] = val);
            });
            var id = ops.id;
            if (typeof id !== "string") {
                id = "ds_mask_" + ++_uuid;
            }
            this.id = id;
            if (Mask._cache[id]) {
                var _mask = Mask._cache[id];
                _mask.ops = ops;
                return _mask;
            }
            Mask._cache[id] = this;
            return this;
        },
        _getElem:function() {
            var elem = this.elem, self = this;
            if (!elem) {
                var ops = this.ops, css = "border:0;margin:0;padding:0;height:100%;width:100%;left:0;top:0;opacity:0;";
                elem = this.elem = $(document.createElement("div"));
                elem.bind("click.jquery_mask", function() {
                    self.ops.onclick.call(self);
                });
                elem[0].style.cssText = css + "display:none;position:fixed;background:" + ops.background + ";z-index:" + ops.zIndex;
                if (!Mask.fixedPositionSupport()) {
                    elem[0].style.position = "absolute";
                    css += "position:absolute;filter:Alpha(opacity=0);";
                    elem[0].innerHTML = '<iframe src="javascript:false" frameborder="0" height="100%" width="100%" style="' + css + 'z-index:1;"></iframe><div style="' + css + 'background:#fff;z-index:9;"></div>';
                }
                elem[0].id = this.id;
                elem.appendTo("body");
            }
            return elem;
        },
        show:function(opacity) {
            var self = this, ops = this.ops, elem = this._getElem();
            opacity = typeof opacity === "number" ? opacity :ops.opacity;
            if (!Mask.fixedPositionSupport()) {
                elem.css("height", DOC.height());
            }
            this.elem.css("background", ops.background).show();
            if (ops.anim) {
                elem.stop().animate({
                    opacity:opacity
                }, ops.animDuration, function() {
                    ops.onshow.call(self, opacity);
                });
            } else {
                elem.stop().css("opacity", opacity);
                ops.onshow.call(this, opacity);
            }
            return this;
        },
        hide:function() {
            var self = this, ops = this.ops, elem = this._getElem();
            if (ops.onhide.call(this) !== false) {
                if (ops.anim) {
                    elem.stop().animate({
                        opacity:0
                    }, ops.animDuration, function() {
                        this.style.display = "none";
                    });
                } else {
                    elem[0].style.display = "none";
                }
            }
            return this;
        },
        destory:function() {
            if (this.elem) {
                this.elem.remove();
                this.elem = null;
            }
            delete Mask._cache[this.id];
        }
    };
    Mask.fixedPositionSupport = function() {
        if (typeof $.support.fixedPosition === "boolean") {
            return $.support.fixedPosition;
        }
        var div, ret = false, body = document.body, css = "border:0;margin:0;padding:0;position:fixed;left:0;top:20px;";
        if (body) {
            div = document.createElement("div");
            div.style.cssText = css + "position:absolute;top:0;";
            div.innerHTML = '<div style="' + css + '"></div>';
            body.insertBefore(div, body.firstChild);
            ret = $.support.fixedPosition = div.firstChild.offsetTop === 20;
            body.removeChild(div);
        }
        return ret;
    };
    ds.mask = $.mask = function(opacity, background) {
        var ops = typeof opacity === "object" ? opacity :{
            opacity:opacity,
            background:background
        };
        ops.id = "ds_global_mask";
        return new Mask(ops).show();
    };
})(this, this.document, jQuery);